iT邦幫忙

2024 iThome 鐵人賽

DAY 22
1
佛心分享-SideProject30

收納規劃APP系列 第 22

Day22:定義回傳型別

  • 分享至 

  • xImage
  •  

要開始開發之前先定義好回傳型別

import express, { Request, Response, Router } from 'express';


export interface ApiResponse<T> {
    success: boolean;  // 是否成功
    data: T;           // 泛型,用於回應資料,可以是物件、陣列等
    total?: number;    // 總數量,當有分頁或需要總數時使用
    totalPages?: number; // 總頁數,當有分頁時使用
    currentPage?: number; // 當前頁碼
    message?: string;  // 訊息,例如成功或錯誤的描述
}

export interface ErrorResponse {
    success: boolean;  // 是否成功
    message: string;  // 錯誤訊息
    errors?: string[];  // 可選,詳細的錯誤訊息列表
    error?: any;  // 可選,原始錯誤訊息或錯誤物件
}



// 錯誤回覆工具函數
export const sendErrorResponse = (res: Response, statusCode: number, message: string, error?: string) => {
    res.status(statusCode).json({
        success: false,
        message,
        error,
    } as ErrorResponse);
};
// 回應工具函數
export const sendSuccessResponse = <T>(
    res: Response,
    statusCode: number,
    data: T,
    options?: {
        total?: number;
        totalPages?: number;
        currentPage?: number;
        message?: string;
    }
) => {
    const response: ApiResponse<T> = {
        success: true,
        data
    };

    // 如果 options 存在且欄位有值,則加進回應
    if (options) {
        if (options.total !== undefined) {
            response.total = options.total;
        }
        if (options.totalPages !== undefined) {
            response.totalPages = options.totalPages;
        }
        if (options.currentPage !== undefined) {
            response.currentPage = options.currentPage;
        }
        if (options.message) {
            response.message = options.message;
        }
    }

    res.status(statusCode).json(response);
};

雖然以前常常接觸Restful API,但這次第一次用了 PUT,以前收到的 API 修改跟新增都是 POST ,看了一下最大的差異好像就是冪(ㄇ一ˋ)等性。至於什麼是冪等性呢?指的是一個操作可以重複執行多次,並且每次執行的結果都是相同的,但我好像也沒有了解到可以解釋清楚的地步,總之我記了結論

  • PUT:
    • /users/123 可以用來更新 ID 為 123 的使用者資訊。如果該使用者不存在,可以選擇創建一個新的使用者。
    • 更新具體 URL 資源的資料,可以選擇根據具體 URL 創建資料
  • POST:
    • /users 可以用來創建一個新使用者,伺服器會返回該新使用者的 ID 和其他相關資料。
    • 創建一個新 USER , URL 由伺服器決定
// 新增一個 FloorPlan
router.post('/****', async (req: Request, res: Response) => {

  try {
    const floorPlanData: Partial<typeof FloorPlan> = req.body;
    const newFloorPlan = await FloorPlan.create(floorPlanData);

    sendSuccessResponse(res, 200, newFloorPlan, { message: 'successfully' });

  } catch (error: any) {
    sendErrorResponse(res, 500, 'Server error', error.message);
  }
});

// 修改一個 FloorPlan
router.put('/****', async (req: Request, res: Response) => {

  try {
    const floorPlanData: Partial<typeof FloorPlan> = req.body;
    const updateFloorPlan = await FloorPlan.findByIdAndUpdate(floorPlanData);

    sendSuccessResponse(res, 200, updateFloorPlan, { message: 'successfully' });

  } catch (error: any) {
    sendErrorResponse(res, 500, 'Server error', error.message);
  }
});

上一篇
Day21:後端建模
下一篇
Day23:API開發結束
系列文
收納規劃APP32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言